#pragma once

#include "../io.h"

namespace sfc::net::sys {

using io::Error;

enum class Domain {
  V4,
  V6,
  Unix,
};

enum class Type {
  Stream,
  Dgram,
  Raw,
};

struct Socket : io::File {
  using Base = io::File;

  Socket() noexcept;
  Socket(io::File&& f) noexcept;
  Socket(Domain domain, Type type);

  auto accept() -> Socket;
  void listen(int backlog);

  struct Addr;
  void bind(const Addr& addr);
  void connect(const Addr& addr);
};

}  // namespace sfc::net::sys
